class MoveArray {
    constructor(list) {
        this.freezeArr = list;
        this.currentArr = list;
    }

    /**
     * 获取移动步数
     * @param findIndex 待查找的 index
     * @param selectValIndexArr 被选中元素索引的数组
     * @param stepNum 每次移动的步数
     * @returns {number} 步数
     */
    getSteps(findIndex, selectValIndexArr, stepNum) {
        var steps = 0;
        for (var i = 0; i < selectValIndexArr.length; i++) {
            if (selectValIndexArr[i] == findIndex) {
                steps++;
                findIndex = findIndex + stepNum;
            } else if (findIndex < selectValIndexArr[i]) {
                break;
            }
        }
        return steps;
    }

    /**
     * 被选中的元素往下移动
     * @param selectVal 被选中元素的数组
     * @returns {Array} 返回移动后的数组
     */
    listMoveDown2(selectVal) {
        // 查找被选中元素的 索引集合
        var selectValIndexArr = this.findOrderSelectValIndex(selectVal);
        // 重新排好序的顺序
        var result = [];
        let targetArr = this.currentArr;
        for (var i = 0; i < targetArr.length; i++) {
            // 获取 原索引 需要往下移动的步数
            var steps = this.getSteps(i, selectValIndexArr, 1);
            if (steps > 0) {
                if (i + steps > targetArr.length - 1) {
                    // 判断 是否底部元素无法进行移动
                    for (; i < targetArr.length; i++) {
                        result[i] = i;
                    }
                    break;
                }
                // 表示 索引i上的元素移动了 steps
                var swap = 0;
                while (steps > 0) {
                    if (!result[i + steps]) {
                        // 初始化 result
                        result[i + steps] = i + steps;
                    }
                    // 交换元素值
                    swap = result[i + steps];
                    result[i + steps] = i;
                    result[i] = swap;
                    steps--;
                    i++;
                }
            } else {
                // 表示 索引 i上的元素 无需移动
                result[i] = i;
            }
        }
        // 元素按下移后的顺序重新排列
        var newResult = [];
        for (var i = 0; i < result.length; i++) {
            newResult[i] = targetArr[result[i]];
        }
        this.currentArr = newResult;
        return targetArr;
    }

    /**
     * 被选中的元素往下移动
     * @param selectVal 被选中元素
     * @returns {*} 返回移动后的结果
     */
    listMoveDown(selectVal) {
        this.currentArr = arrayMoveDown(this.currentArr, selectVal);
        return this.currentArr;
    }

    /**
     * 被选中的元素往上移动
     * @param selectVal 被选中元素
     * @returns {*} 返回移动后的结果
     */
    listMoveUp(selectVal) {
        this.currentArr = arrayMoveUp(this.currentArr, selectVal);
        return this.currentArr;
    }

    /**
     * 把选中元素移动到顶部
     * @param selectVal 被选中元素
     * @returns {*} 返回移动后的结果
     */
    listMoveTop(selectVal) {
        this.currentArr = arrayMoveTop(this.currentArr, selectVal);
        return this.currentArr;
    }

    /**
     * 把选中元素移动到底部
     * @param selectVal 被选中元素
     * @returns {*} 返回移动后的结果
     */
    listMoveBottom(selectVal) {
        this.currentArr = arrayMoveBottom(this.currentArr, selectVal);
        return this.currentArr;
    }

    /**
     * 重置数组
     * @returns {*}
     */
    reset() {
        this.currentArr = this.freezeArr
    }

}

